﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Caixa.Model;
using Caixa.DB;
using System.Data.Common;
using System.Collections;

namespace Caixa.DAO
{
	public static class ClienteDAO
	{
		#region " Methods "

		#region " Get Methods "

		public static Cliente GetByID(int id)
		{
			Cliente c = null;

			using (DAHelper db = new DAHelper())
			{
				string SQL = string.Format(@"
					SELECT 
						{1}, {2}, {3}, {4}, {5}, {6}
					FROM {0}
					WHERE
						{1} = :{1}
				",
					Cliente.Fields.TABELA,
					Cliente.Fields.ID,
					Cliente.Fields.NOME,
					Cliente.Fields.CPF,
					Cliente.Fields.RG,
					Cliente.Fields.ENDERECO,
					Cliente.Fields.IDADE
				);

				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(Cliente.Fields.ID, id));

				// Executa a query no banco de dados
				IEnumerator data = db.SelectSqlDr(SQL, parms.ToArray()).GetEnumerator();

				// Converte o resultado do banco de dados em objeto
				c = DAHelper.ToModel<Cliente>(data);
			}

			return c;
		}

		public static bool ExisteCliente(int id)
		{
			bool exists = false;

			using (DAHelper db = new DAHelper())
			{
				string SQL = string.Format(@"
					SELECT 
						{1}
					FROM {0}
					WHERE
						{1} = :{1}
				",
					Cliente.Fields.TABELA,
					Cliente.Fields.ID
				);

				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(Cliente.Fields.ID, id));

				// Executa a query no banco de dados
				int clienteID;
				int.TryParse(string.Format("{0}", db.SelectSqlSc(SQL, parms.ToArray())), out clienteID);

				// Retorna se o ID do cliente foi encontrado
				exists = (clienteID > 0);
			}

			return exists;
		}

		#endregion

		#region " DDL Methods "

		public static int Insert(Cliente c)
		{
			int newID = 0;

			using (DAHelper db = new DAHelper())
			{
				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(Cliente.Fields.NOME, c.Nome));
				parms.Add(db.GetParameter(Cliente.Fields.CPF, c.CPF));
				parms.Add(db.GetParameter(Cliente.Fields.RG, c.RG));
				parms.Add(db.GetParameter(Cliente.Fields.ENDERECO, c.Endereco));
				parms.Add(db.GetParameter(Cliente.Fields.IDADE, c.Idade));

				// Executa a query no banco de dados e retorna o ID do novo registro
				newID = db.InsertSql(Cliente.Fields.TABELA, parms.ToArray());
			}

			return newID;
		}

		public static bool Update(Cliente c)
		{
			bool success = false;

			using (DAHelper db = new DAHelper())
			{
				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(Cliente.Fields.NOME, c.Nome));
				parms.Add(db.GetParameter(Cliente.Fields.CPF, c.CPF));
				parms.Add(db.GetParameter(Cliente.Fields.RG, c.RG));
				parms.Add(db.GetParameter(Cliente.Fields.ENDERECO, c.Endereco));
				parms.Add(db.GetParameter(Cliente.Fields.IDADE, c.Idade));

				// Define a cláusula where do Update
				string sWhere = string.Format("{0} = {1}", Cliente.Fields.ID, c.ID);

				// Executa a query no banco de dados e retorna se foi atualizado com sucesso
				success = db.UpdateSql(Cliente.Fields.TABELA, parms.ToArray(), sWhere);
			}

			return success;
		}

		public static bool Delete(Cliente c)
		{
			bool success = false;

			using (DAHelper db = new DAHelper())
			{
				// Define a cláusula where do Delete
				string sWhere = string.Format("{0} = {1}", Cliente.Fields.ID, c.ID);

				// Executa a query no banco de dados e retorna se o registro foi excluido com sucesso
				success = db.DeleteSql(Cliente.Fields.TABELA, sWhere);
			}

			return success;
		}

		#endregion

		#endregion
	}
}
